// 语法 array.reduce(function(prev, currentValue, currentIndex, arr), initialValue)
Array.prototype.myReduce = function(fn, initialVal) {
  // 调用此方法的数组进行一次浅拷贝
  const arr = [...this];
  // 注意reduced对空数组是不会执行回调函数的。
  if (!arr.length) {
    return
  }
  let res;
  // 如果提供初始值 从初始值开始执行
  if (initialVal) {
    res = initialVal;
    for (let i = 0; i < arr.length; i++) {
      res = fn(res, arr[i], i, this)
    }
  } else {
    // 没有 从第一个元素开始执行
    res = arr[0];
    for (let i = 1; i < arr.length; i++) {
      res = fn(res, arr[i], i, this)
    }
  }
  return res;
}

const array1 = [1, 2, 3, 4];
const reducer = (accumulator, currentValue) => accumulator + currentValue;
console.log(array1.myReduce(reducer));